package com.mh.web.controller.system;


import com.mh.common.core.controller.BaseController;
import com.mh.common.core.domain.BaseResp;
import com.mh.common.core.page.PageResult;
import com.mh.common.utils.SecurityUtils;
import com.mh.system.domain.SysDictData;
import com.mh.system.service.SysDictDataService;
import com.mh.system.service.SysDictTypeService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController
@RequestMapping("/system/dict/data") //根据前端访问路径设置
public class SysDictDataController extends BaseController {

    @Autowired
    private SysDictDataService dictDataService;

    @Autowired
    private SysDictTypeService dictTypeService;

    //1. 查询字典数据列表(分页)-->不传参数:查询全部;传参数:根据参数带条件查询
    @RequestMapping("/list")
    //查询结果需要分页返回,因此返回类型为自定义的PageResult(这里会封装数据)
    public PageResult list(SysDictData dictData) {

        //开启分页(必须要先开
        startPage();
        //调用service
        List<SysDictData> dictDataList = dictDataService.selectDictDataList(dictData);

        //调用BaseController的getData()方法,传入需要封装的List
        //方法体中通过交PageResult封装数据,BaseController返回前端
        return getData(dictDataList);
    }

    //2. 根据ID查询数据信息
    @GetMapping("/{dictCode}")
    public BaseResp getInfo(@PathVariable Long dictCode){
        return BaseResp.success(dictDataService.selectDictDataById(dictCode));
    }

    //3. 根据字典数据类型查询字典数据信息
    //前端清除访问此路径请求数据,因此数据存储在redis缓存中,方便拿取
    @GetMapping("/type/{dictType}")
    public BaseResp getInfo(@PathVariable String dictType){
        //首先要从redis缓存中拿数据,此操作逻辑代码在TypeService,因此调用TypeService
        return BaseResp.success(dictTypeService.selectDictDataByType(dictType));
    }

    //4. 保存数据(添加数据)
    @PostMapping
    public BaseResp save(@RequestBody SysDictData dictData) {

        //获取当前操作的用户名(通过自定义类获取)
        String username = SecurityUtils.getUsername();

        //设置数据创建者
        dictData.setCreateBy(username);
        //BaseController的toAjax(): 封装增删改操作受影响行数
        return toAjax(dictDataService.insertDictData(dictData));
    }

    //5. 更新(修改)数据
    @PutMapping
    public BaseResp update(@RequestBody SysDictData dictData) {
        //设置数据更新者(修改者)-->当前操作用户
        dictData.setUpdateBy(SecurityUtils.getUsername());
        //封装返回受影响行数
        return toAjax(dictDataService.updateDictData(dictData));
    }

    //6. 批量删除数据,接收dictCode数组
    @DeleteMapping("/{dictCodes}")
    public BaseResp delete(@PathVariable Long[] dictCodes){
        return toAjax(dictDataService.deleteDictDataByIds(dictCodes));
    }
}
